#ifndef __FILETOOL__
#define __FILETOOL__

#include <iostream>
#include <string>
#include <fstream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "Log.hpp"
using namespace LOGSpace;
extern int errno; // 错误码
// 文件工具类
namespace FILETOOL
{
    
    class FileTool
    {
    public:
        FileTool(const std::string &filename) : _filename(filename)
        {
        }
        ~FileTool()
        {
        }
        // 判断文件是否存在
        bool IsFileExist()
        {
            _result = access(_filename.c_str(), F_OK);
            if (_result < 0)
            {
                LOG(WARNING, "filename is not exist!\n");
                return false;
            }
            return true;
        }
        // 如果文件存在，获取文件的大小
        size_t size()
        {
            if (this->IsFileExist() == false)
            {
                return false;
            }
            struct stat filest;
            _result = stat(_filename.c_str(), &filest);
            if (_result < 0)
            {
                LOG(WARNING, "git file size failed!,error code = %d\n", errno);
                return false;
            }
            return filest.st_size;
        }
        // 读取文件中的数据
        bool GetContent(std::string *body)
        {
            std::ifstream ifs(_filename, std::ios::binary); // 二进制打开文件
            if (!ifs.is_open())
            {
                LOG(ERROR, "file open error!\n");
                return false;
            }
            // 预设置body大小
            int filesize = this->size();
            body->resize(filesize);
            // 读取文件数据->body中
            ifs.read(&(*body)[0], filesize);
            if (!ifs.good())
            {
                LOG(WARNING, "read filedata error!\n");
                ifs.close();
                return false;
            }
            ifs.close();
            return true;
        }
        // 将数据写入到文件中
        bool SetContent(const std::string& data)
        {
            std::ofstream ofs(_filename, std::ios::binary | std::ios::app);
            if (!ofs.is_open())
            {
                LOG(ERROR, "file open error!\n");
                return false;
            }
            ofs.write(data.c_str(), data.size());
            if (!ofs.good())
            {
                LOG(WARNING, "write filedata error!\n");
                ofs.close();
                return false;
            }
            ofs.close();
            return true;
        }
        // 在指定路径下创建目录
        bool CreateDir()
        {
            if(this->IsFileExist())
            {
                LOG(INFO,"dir existed!\n");
                return true;
            }
            _result = mkdir(_filename.c_str(), 0777);
            if (_result < 0)
            {
                LOG(WARNING, "mkdir failed!,error code = %d\n", errno);
                return false;
            }
            return true;
        }
        // 获取创建的文件 | 目录名
        std::string GetFilename()
        {
            return _filename;
        }

    private:
        std::string _filename; // 创建的文件名
        int _result = -1;      // 系统调用是否成功
    };
}

#endif